from flask import Blueprint, jsonify, request

# 创建了一个名为'auth'的Blueprint，像应用程序对象一样，blueprint需要知道它是在哪里定义的，因此传递一个__name__作为第二个参数（蓝图所在的模块或者包）。
# url_prefix的值将被追加到所有与blueprint有关的URLs的前面。
from app.dao.auth.UserDao import UserDao
from app.handler.factory import ResponseFactory
from app.middlerware.Jwt import UserToken
from app.utils.decorator import permission

# 创建蓝图
auth = Blueprint("auth", __name__, url_prefix="/auth")


# 这里以auth.route注册的函数都会自带/auth，所以url是/auth/register
@auth.route("/register", methods = ["POST"])
def register():
    '''
    接收传入的  用户名 /密码 / 邮箱  注册信息，
    对参数进行一些关键校验，然后调用刚才的核心方法UserDao.register。

    :return: code=101 是参数错误，110 是异常错误, 0 是正常返回。
    '''
    # return jsonify(dict(status=True, msg="注册成功"))

    # request.get_json() 可以直接获取到传入的json数据，并返回一个dict对象。

    # 获取request请求数据
    data = request.get_json()
    # 用户名密码 赋值
    username,password = data.get("username"), data.get("password")
    # 判断用户名密码 是否为空
    if not username or not password:
        return jsonify(dict(code=101, msg='用户名或密码不能为空'))
    # 判断邮箱、姓名是否为空
    email, name = data.get("email"), data.get("name")
    if not email or not name:
        return jsonify(dict(code=101, msg='邮箱或姓名不能为空'))
    # 引入核心方法，调用Dao层 的 register 方法把数据写入数据库
    err = UserDao.register_user(username, name, password, email)
    # 没有出错返回 None
    if  err is not None:
        return jsonify(dict(code=110, msg=err))
    # 注册成功的返回
    return jsonify(dict(code=0, msg="注册成功"))



@auth.route('/login', methods = ["POST"])
def login():
    data = request.get_json()
    username, password = data.get("username"), data.get("password")
    # 判断用户名密码是否为空
    if not username or not password:
        return jsonify(dict(code=101, msg="用户名或密码不能为空"))
    # 调用Dao 层的 login
    user, err = UserDao.login(username,password)

    if err:
        return jsonify(dict(code=110, msg=err))

    # password 是忽略字段
    user = ResponseFactory.model_to_dict(user, "password")

    # 生成token
    token = UserToken.get_token(user)
    print(f"token==>{token}")
    #
    return jsonify(dict(code=0,msg="登录成功",data=dict(token=token, user=user)))


# 获取用户列表
@auth.route("/listUser")
@permission()
def list_users(user_info):
    users,err = UserDao.list_users()
    if err is not None:
        return jsonify(dict(code=110, msg=err))

    return jsonify(dict(code=0, msg="操作成功",data=ResponseFactory.model_to_list(users)))



